<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index11-工厂函数/构造函数/原型</title>
</head>
<body>
  <script type="text/javascript">
    // 对象字面量
    // var person = {
    //   name: '张三',
    //   age: 20,
    //   gender: "男",
    //   // 自我介绍
    //   show : function(){
    //     return "我的名字是:" + this.name + ",我的年龄是:" + this.age + "," + this.gender;
    //   }
    // };
    // console.log(person.name);
    // console.log(person.age);
    // console.log(person.gender);
    // console.log(person.show());
    // new Object()
    // var person = new Object();
    // person.name = "张三";
    // person.age = 20;
    // person.gender = "男";
    // person.show = function (){
    //   return "我的名字是:" + this.name + ",我的年龄是:" + this.age + "," + this.gender;
    // }
    // console.log(person.name);
    // console.log(person.age);
    // console.log(person.gender);
    // console.log(person.show());

    // 工厂函数：作用用来批量创建对象
    // 定义一个创建人的对象的工厂函数
    // function createFactory(name, age, gender){
    //     // 创建对象
    //     var obj = new Object();
    //     obj.name = name;
    //     obj.age = age;
    //     obj.gender = gender;
    //     obj.show = function(){
    //       return "我的名字是:" + this.name + ",我的年龄是:" + this.age + "," + this.gender;
    //     };
    //     return obj;
    // }
    // var p1 = createFactory("张三",20, "男");
    // console.log(p1.show());
    // var p2 = createFactory("李四",25, "女");
    // console.log(p2.show());
    // var dog = createFactory("大黄", 10, "公");
    // console.log(dog.show());

    // 上面工厂函数再创建对象时不能明确是哪种类型的对象，由此引入的构造函数,其实就一种特殊函数，用来创建对象使用，通过new关键字调用
    // 在js中构造函数的命名首字母大写

    // 自我介绍的函数定义在全局作用域下
    // function show(){
    //   return "我的名字是:" + this.name + ",我的年龄是:" + this.age + "," + this.gender;
    // }

    // 定义Person构造函数
    function Person(name, age, gender){
        // console.log(this);
        // this.name = name;
        this.age = age;
        this.gender = gender;
        // this.show = function(){
        //   return "我的名字是:" + this.name + ",我的年龄是:" + this.age + "," + this.gender;
        // }
      // this.show = show;
    }

    // 原型：原型也是一个对象，原型对象绑定到某个构造函数上的，而且被构造函数的多个实例共享
    // 原型对象的属性名：prototype
    Person.prototype.name = "哈哈哈";
    Person.prototype.show = function(){
      return "我的名字是:" + this.name + ",我的年龄是:" + this.age + "," + this.gender;
    };

    // Person(); // this代表是window
    // 构造函数需要通过new来调用
    // var p = new Person("张三", 20, "男");
    // // console.log(typeof(p));
    // console.log(p);
    // console.log(p.show());
    var p1 = new Person("张三", 20, "男");
    var p2 = new Person("李四", 21, "女");
    console.log(p1.show == p2.show);
    console.log(p1.show());
    console.log(p2.show());
  </script>
</body>
</html>